package net.esj.basic.core.engine.tools.formate.string;

import net.esj.basic.core.engine.tools.formate.ExecuteChain;

/**
 * <PRE>
 * 全角字符->半角字符转换  
 * 只处理全角的空格，全角！到全角～之间的字符，忽略其他
 * </PRE>
 */
public class DBCFormatter extends StringFormatter {
	
	/**
	 * 全角对应于ASCII表的可见字符从！开始，偏移值为65281
	 */
	static final char SBC_CHAR_START = 65281; // 全角！

	/**
	 * 全角对应于ASCII表的可见字符到～结束，偏移值为65374
	 */
	static final char SBC_CHAR_END = 65374; // 全角～

	/**
	 * ASCII表中除空格外的可见字符与对应的全角字符的相对偏移
	 */
	static final int CONVERT_STEP = 65248; // 全角半角转换间隔

	/**
	 * 全角空格的值，它没有遵从与ASCII的相对偏移，必须单独处理
	 */
	static final char SBC_SPACE = 12288; // 全角空格 12288
	
	/**
	 * 半角空格的值，在ASCII中为32(Decimal)
	 */
	static final char DBC_SPACE = ' '; // 半角空格

	@Override
	public void doExecute(ExecuteChain chain,CharSequence target) {
		StringBuilder buf = new StringBuilder(target.length());
		for (int i = 0; i < target.length(); i++) {
			if (target.charAt(i) >= SBC_CHAR_START && target.charAt(i) <= SBC_CHAR_END) { // 如果位于全角！到全角～区间内
				buf.append((char) (target.charAt(i) - CONVERT_STEP));
			} else if (target.charAt(i) == SBC_SPACE) { // 如果是全角空格
				buf.append(DBC_SPACE);
			} else { // 不处理全角空格，全角！到全角～区间外的字符
				buf.append(target.charAt(i));
			}
		}
		target = buf.toString();
		if(chain!=null){
			chain.doExecute(target);
		}
	}

}
